# language: zh-CN
# 需求ID: REQ-003
# SRS需求: 4.2 动态Schema管理
# Feature ID: Epic 3.3
# 用户故事: US-012, US-013, US-014
功能: 动态Schema管理
  作为开发者
  我希望能自动创建数据库表结构并支持DSL v2.0规范
  以便快速部署新模型并支持类型别名和跨字段验证

  背景:
    假设我是一个开发者
    并且我定义了新的YAML DSL v2.0模型
    并且我希望数据库结构能自动同步
    并且我使用了类型别名和参数化模板

  # US-012: 作为开发者，我希望能自动创建数据库表结构
  场景: 自动创建数据库表结构支持DSL v2.0特性
    假设我定义了一个新的实体:
      """
      tests/cucumber/fixtures/entities/user-dsl.yml
      """
    当系统启动或模型更新时
    那么应该自动创建User表
    并且应该创建正确的字段类型和约束
    并且应该创建必要的索引
    并且应该创建外键关系
    并且应该设置自动时间戳字段
    并且应该正确映射类型别名到数据库字段类型
    并且应该创建跨字段验证的数据库约束
    并且应该根据参数化模板生成动态字段结构

  # US-013: 作为开发者，我希望能安全地修改Schema
  场景: 安全地添加新字段支持DSL v2.0特性
    假设我已有一个现有的User实体Schema:
      """
      tests/cucumber/fixtures/entities/user-dsl.yml
      """
    当我在现有实体中添加新字段:
      """
      # DSL v2.0 扩展语法
      domain: UserManagement
      version: 2.0.0
      
      type_aliases:
        PhoneNumber: string
        UserStatus: string
      
      entities:
        User:
          attributes:
            phone:
              type: PhoneNumber  # 使用类型别名
              rules:
                - pattern: "^\\+?[1-9]\\d{1,14}$"
            
            status:
              type: UserStatus  # 使用类型别名
              rules:
                - enum: ['active', 'inactive', 'suspended']
                - default: 'active'
      """
    当系统检测到模型变更时
    那么应该自动添加phone和status字段
    并且应该为新字段设置默认值
    并且应该保持现有数据不受影响
    并且应该记录Schema变更历史

  场景: 安全地修改字段约束
    假设我需要修改字段约束:
      """
      entity User {
        id: string @primary
        name: string @required @maxLength(200)  // 从100增加到200
        email: string @unique @required         // 新增required约束
      }
      """
    当系统检测到约束变更时
    那么应该验证现有数据是否符合新约束
    并且应该安全地应用非破坏性约束变更
    并且应该对破坏性变更提供警告
    并且应该提供数据清理建议

  # US-014: 作为开发者，我希望能自动管理外键关系和索引
  场景: 自动管理外键关系
    假设我定义了实体间的关联:
      """
      tests/cucumber/fixtures/entities/order.yml
      ---
      tests/cucumber/fixtures/entities/orderitem.yml
      ---
      tests/cucumber/fixtures/entities/product.yml
      """
    当系统创建表结构时
    那么应该自动创建外键约束
    并且应该设置正确的级联删除规则
    并且应该创建外键索引
    并且应该验证引用完整性

  场景: 自动索引管理
    假设我在YAML DSL中声明了索引需求:
      """
      tests/cucumber/fixtures/entities/user-dsl.yml
      """
    当系统创建表结构时
    那么应该自动创建所有声明的索引
    并且应该创建复合索引
    并且应该创建唯一索引
    并且应该创建合适的索引策略
    并且应该监控索引使用情况

  场景: 处理破坏性Schema变更
    假设我需要删除一个字段:
      """
      entity User {
        id: string @primary
        name: string @required
        // 删除了email字段
      }
      """
    当系统检测到破坏性变更时
    那么应该阻止自动执行变更
    并且应该生成警告信息
    并且应该要求明确的确认
    并且应该提供数据备份建议
    并且应该生成手动迁移脚本

  场景: Schema版本管理
    假设我需要跟踪Schema变更历史
    当系统执行Schema变更时
    那么应该记录变更版本号
    并且应该保存变更详情和时间戳
    并且应该支持Schema版本回滚
    并且应该提供变更历史查询接口
    并且应该生成变更报告

  场景: 多环境Schema同步
    假设我需要在不同环境间同步Schema
    当我部署到新环境时
    那么系统应该检测Schema差异
    并且应该生成同步脚本
    并且应该验证同步的安全性
    并且应该支持增量同步
    并且应该提供同步状态报告

  场景: Schema变更的事务性
    假设我执行复杂的Schema变更
    当变更过程中发生错误时
    那么应该回滚所有已执行的变更
    并且应该保持数据库的一致性
    并且应该记录失败原因和恢复建议
    并且应该支持手动恢复操作